package org.aspire.core;

import org.aspire.graphics.Frame;
import org.aspire.math.geom.Dimension;

/******************************************************************************
 * Contains the configuration settings for a generic 2D game.
 * 
 * @author JPACarabuena
 *****************************************************************************/
public interface Config {
	
	// ========================================================================
	// Final Fields
	// ========================================================================

	// ========================================================================
	// Getters & Setters
	// ========================================================================

	/**************************************************************************
	 * Checks the title of the game.
	 * 
	 * @return the working title for this game.
	 *************************************************************************/
	public String getGameTitle();
	
	/**************************************************************************
	 * Checks the icon of the game.
	 * 
	 * @return the working icon for this game.
	 *************************************************************************/
	public Frame getGameIcon();
	
	/**************************************************************************
	 * Checks the screen display size for this game.
	 * 
	 * @return the screen display size.
	 *************************************************************************/
	public Dimension getScreenDisplaySize();
	
	/**************************************************************************
	 * Checks the FPS rate for this game.
	 * 
	 * @return	the FPS rate.
	 *************************************************************************/
	public int getFPS();
	
	/**************************************************************************
	 * Checks if loop controller process regulating is enabled.
	 * 
	 * @return	whether or not process is regulated.
	 *************************************************************************/
	public boolean isProcessRegulated();
	
	/**************************************************************************
	 * Checks if update variable is constant or predicted.
	 * 
	 * @return	whether or not update variable is smooth.
	 *************************************************************************/
	public boolean isUpdateSmooth();
	
	/**************************************************************************
	 * Checks the resolution to be used for this game.
	 * 
	 * @return	the units of time to be used for this game.
	 *************************************************************************/
	public int getResolution();
	
	/**************************************************************************
	 * Gets the base resource path where all the game resources are found.
	 * 
	 * @return	the base resource path for this game.
	 *************************************************************************/
	public String getBaseResourcePath();
	
	/**************************************************************************
	 * Set the title of this game to the specified new title.
	 * 
	 * @param title	the new title of this game.
	 *************************************************************************/
	public void setGameTitle(String title);
	
	/**************************************************************************
	 * Set the icon of this game to the specified new icon.
	 * 
	 * @param icon	the new icon of this game.
	 *************************************************************************/
	public void setGameIcon(Frame icon);
	
	/**************************************************************************
	 * Set the size of the screen display to the specified width and height.
	 * 
	 * @param width	the width of the screen display.
	 * @param height the height of the screen display.
	 *************************************************************************/
	public void setScreenDisplaySize(float width, float height);
	
	/**************************************************************************
	 * Sets the size of the screen display to the specified size.
	 * 
	 * @param size	the size of the screen display.
	 *************************************************************************/
	public void setScreenDisplaySize(Dimension size);
	
	/**************************************************************************
	 * Sets the base resource path for this game to specified path.
	 * 
	 * @param str	the new base resource path.
	 *************************************************************************/
	public void setBaseResourcePath(String str);
	
	/**************************************************************************
	 * Sets the FPS rate for this game to the specified iterations per second. 
	 * 
	 * @param fps	the new FPS rate.
	 *************************************************************************/
	public void setFPS(int fps);
	
	/**************************************************************************
	 * Enable or disable loop controller process regulation.
	 * 
	 * @param regulate	whether or not process regulation is enabled.
	 *************************************************************************/
	public void enableRegulateProcess(boolean regulate);
	
	/**************************************************************************
	 * Enable or disable smooth update.
	 * 
	 * @param smooth	whether or not update is constant or predicted.
	 *************************************************************************/
	public void enableSmoothUpdate(boolean smooth);
	
	/**************************************************************************
	 * Sets the timer resolution to the specified units of time.
	 * 
	 * @param resolution	the new resolution.
	 *************************************************************************/
	public void setResolution(int resolution);
	
	// ========================================================================
	// Override Methods
	// ========================================================================

	// ========================================================================
	// Methods
	// ========================================================================

	// ========================================================================
	// Inner & Anonymous Classes
	// ========================================================================
}